package szlx;

import java.lang.reflect.Method;

public class javaBean3 {
    public static void main(String[] args) throws Exception {
        //通过反射加载Person类
        Class clz = Class.forName("entity.Person");
        //根据方法名和参数列表获取static final int getAge()方法
        //没有参数可以不写或者null表示
        Method getAge = clz.getDeclaredMethod("getAge",null);
        //getAge方法为default(package),这里超出访问范围，不能直接访问
        //通过setAccessable方法,设定可以访问
        getAge.setAccessible(true);
        //根据getAge并传参，没有参数可以不写或用null表示
        //setAccessable方法为静态方法，调用时可以不指定具体Person实例
        Object returnAge = getAge.invoke(null,null);
        System.out.println("年龄是："+ returnAge);

        Object person = clz.newInstance();//创建Person实例
        //根据方法名和参数列表获取private void silentMethod（）方法;
        //没有参数可以不写或者null表示
        Method silentMethod = clz.getDeclaredMethod("silentMethod",null);
        //silentMethod方法为private，这里超出访问范围，不能直接访问
        //通过setAccessable方法,设定可以访问
        silentMethod.setAccessible(true);
        //调用silentMethod方法并传参，没有参数可以不用写或null表示
        silentMethod.invoke(person,null);


        //根据方法名和参数列表获取 public void setName（String）方法
        Method setName = clz.getDeclaredMethod("setName",String.class);
        //setName方法为Public，这里可以直接访问
        //调用setName方法并传参
        setName.invoke(person, "java开发之框架基础技术");
        //验证结果
        Object returnName = clz.getDeclaredMethod("getName").invoke(person);
        System.out.println("刚才设定的name是:"+returnName);
    }
}
